package classificator.database;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**Mappa lo schema di una tabella di un database
 * contiene la classe innestata column
 *
 * @author Administrator
 */
public class TableSchema {
    //lista delle colonne della tabella
    private List<Column> tableSchema = new ArrayList<Column>();
    
    /**Crea lo schema della tabella in input
     * 
     * @param tableName nome tabella 
     * @throws SQLException 
     */
    public TableSchema(String tableName) throws SQLException {
        HashMap<String, String> mapSQL_JAVATypes = new HashMap<String, String>();
        mapSQL_JAVATypes.put("CHAR", "string");
        mapSQL_JAVATypes.put("VARCHAR", "string");
        mapSQL_JAVATypes.put("LONGVARCHAR", "string");
        mapSQL_JAVATypes.put("BIT", "string");
        mapSQL_JAVATypes.put("SHORT", "number");
        mapSQL_JAVATypes.put("INT", "number");
        mapSQL_JAVATypes.put("LONG", "number");
        mapSQL_JAVATypes.put("FLOAT", "number");
        mapSQL_JAVATypes.put("DOUBLE", "number");

        Connection con = DbAccess.getConnection();
        DatabaseMetaData meta = con.getMetaData();
        ResultSet rs = meta.getColumns(null, null, tableName, null);
        while (rs.next()) {
            if (mapSQL_JAVATypes.containsKey(rs.getString("TYPE_NAME"))) 
                tableSchema.add(new Column(rs.getString("COLUMN_NAME"),
                        mapSQL_JAVATypes.get(rs.getString("TYPE_NAME"))));
        }
        rs.close();
    }
    
    /**Restituisce il numero dei campi della tabella.
     * 
     * @return numero campi
     */
    public int getNumberOfAttributes() {
        return tableSchema.size();
    }

    /**Restituisce la colonna in posizione index della tabella
     * 
     * @param index posizione
     * @return colonna
     */
    public Column getColumn(int index) {
        return tableSchema.get(index);
    }
    
    public class Column {
        private String name;
        private String type;

        Column(String name, String type) {
            this.name = name;
            this.type = type;
        }

        public String getColumnName() {
            return name;
        }

        public boolean isNumber() {
            return type.equals("number");
        }
        
        public boolean isString(){
            return type.equals("string");
        }

        @Override
        public String toString() {
            return name + ":" + type;
        }
    }
}